package gestion.camping.dao.impl;

import gestion.camping.dao.GenericDAO;
import gestion.camping.dto.Saison;
import gestion.camping.dto.Tarif;
import gestion.camping.dto.TypeLocation;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 * Permet la lecture, la modification, l'ajout ou la suppresion en base des enregistrement de la table Tarif
 * 
 * @author Gombert Damien
 * @author Foucras Melanie
 * @author Germa Romain
 * 
 * @version 1.0
 */
public class TarifDao extends GenericDAO<Tarif>{

	private SaisonDao saisonDao;
	private TypeLocationDao typeLocationDao;
	
	public TarifDao(Connection conn) {
		super(conn);
		
		saisonDao = new SaisonDao(conn);
		typeLocationDao = new TypeLocationDao(conn);
	}

	
	
	@Override
	public Tarif create(Tarif obj) {
		
		try {
			Statement smt = connect.createStatement();
			
			//On prépare la requête d'insertion
			String rqt = String.format("INSERT INTO TARIF VALUES(%1$s, %2$s, %3$s)",
					obj.getSaison().getId(), obj.getTypeLocation().getId(), obj.getTarif());
			
			//On trace la requête dans la console
			System.out.println(rqt);
			
			//ON effectue l'insertion en base de données		
			smt.executeUpdate(rqt);
			
			//On ferme la transaction
			smt.close();
			
			obj = this.find(obj.getSaison().getId(), obj.getTypeLocation().getId());
									
		} catch (SQLException e) {
			gestionErreurSQL(e);
		}
		
		
		return obj;
	}

	@Override
	public boolean delete(Tarif obj) {
		return false;
	}

	@Override
	public Tarif update(Tarif obj) {
		
		try {
			Statement smt = connect.createStatement();
			
			//On récupère le id qu'aura notre futur enregistrement
			//TODO Controler la date version
			
			//On prépare la requête de modification
			String rqt = String.format("UPDATE TARIF T SET T.TARIF_PRIX = %1$s " +
										"			   WHERE T.SAISON_NUM = %2$s"+
										"			   AND   T.TYPELOCATION_NUM = %3$s",
										obj.getTarif(),
										obj.getSaison().getId(),
										obj.getTypeLocation().getId());
			
			//On trace la requête dans la console
			System.out.println(rqt);
			
			//ON effectue l'insertion en base de données		
			smt.executeUpdate(rqt);
			
			//On ferme la transaction
			smt.close();
						
			obj = this.find(obj.getSaison().getId(), obj.getTypeLocation().getId());
			
		} catch (SQLException e) {
			gestionErreurSQL(e);
		}
		
		return obj;
	}

	public boolean chercher(Saison saison, TypeLocation typeLocation) {
		Tarif dto = new Tarif();
		Boolean trouve = false;
		
		try {
			
			Statement smt = connect.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
			
			StringBuilder rqt = new StringBuilder("SELECT * FROM TARIF T ");
			boolean clause = false;
			if(saison != null){
				rqt.append(" WHERE T.SAISON_NUM="+ saison.getId());
				clause = true;
			}
			
			if(typeLocation != null){
				if(clause){
					rqt.append(" AND ");
				}else{
					rqt.append(" WHERE ");
				}
				
				rqt.append(" T.TYPELOCATION_NUM="+typeLocation.getId());
			}
			
			
			//Execution de la requ�te
			ResultSet res = smt.executeQuery(rqt.toString());		
			
			// si il y a des r�sultat, on se positionne sur le premier enregistrement
			if(res.first()){
				// Et on initialise le dto
				dto.setTarif(res.getDouble("TARIF_PRIX"));
				dto.setSaison(saisonDao.find(res.getInt("SAISON_NUM")));
				dto.setTypeLocation(typeLocationDao.find(res.getInt("TYPELOCATION_NUM")));
				trouve=true;
			}
			
			//On ferme la transaction
			smt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return trouve;
	}



	public List<Tarif> findAllTarif() {
		List<Tarif> listTarif = new ArrayList<Tarif>();
		Tarif dto;
		
		try {
			
			Statement smt = connect.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
			
			String rqt = "SELECT * FROM TARIF T";
			
			//Execution de la requ�te
			ResultSet res = smt.executeQuery(rqt);		
			
			// si il y a des r�sultat, on se positionne sur le premier enregistrement
			while(res.next()){
				dto = new Tarif();
				// Et on initialise le dto
				dto.setTarif(res.getDouble("TARIF_PRIX"));
				dto.setSaison(saisonDao.find(res.getInt("SAISON_NUM")));
				dto.setTypeLocation(typeLocationDao.find(res.getInt("TYPELOCATION_NUM")));
				listTarif.add(dto);
				
			}
			
			//On ferme la transaction
			smt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return listTarif;
	}



	public List<Tarif> findBySaisonTypeLocation(Saison saison, TypeLocation typeLocation) {
		
		List<Tarif> listTarif = new ArrayList<Tarif>();
		Tarif dto;
		
		try {
			
			Statement smt = connect.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
			
			StringBuilder rqt = new StringBuilder("SELECT * FROM TARIF T ");
			boolean clause = false;
			if(saison != null ){
				rqt.append(" WHERE T.SAISON_NUM ="+ saison.getId());
				clause = true;
			}
			
			if(typeLocation != null){
				if(clause){
					rqt.append(" AND ");
				}else{
					rqt.append(" WHERE ");
				}
				
				rqt.append(" T.TYPELOCATION_NUM = "+ typeLocation.getId());
			}
			
	
			//Execution de la requ�te
			ResultSet res = smt.executeQuery(rqt.toString());		
			
			// si il y a des r�sultat, on se positionne sur le premier enregistrement
			while(res.next()){
				dto = new Tarif();
				// Et on initialise le dto
				dto.setTarif(res.getDouble("TARIF_PRIX"));
				dto.setSaison(saisonDao.find(res.getInt("SAISON_NUM")));
				dto.setTypeLocation(typeLocationDao.find(res.getInt("TYPELOCATION_NUM")));
				listTarif.add(dto);
				
			}
			
			//On ferme la transaction
			smt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return listTarif;
	}


	public Tarif find(long idSaison, long idTypeLocation) {
		Tarif dto = new Tarif();
		
		try {
			
			Statement smt = connect.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
			
			StringBuilder rqt = new StringBuilder("SELECT * FROM TARIF T WHERE T.TYPELOCATION_NUM="+idTypeLocation +
																		"  AND T.SAISON_NUM="+ idSaison);
	
			
			//Execution de la requ�te
			ResultSet res = smt.executeQuery(rqt.toString());		
			
			// si il y a des r�sultat, on se positionne sur le premier enregistrement
			if(res.first()){
				// Et on initialise le dto
				dto.setTarif(res.getDouble("TARIF_PRIX"));
				dto.setSaison(saisonDao.find(res.getInt("SAISON_NUM")));
				dto.setTypeLocation(typeLocationDao.find(res.getInt("TYPELOCATION_NUM")));
			}
			
			//On ferme la transaction
			smt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return dto;
	}



	@Override
	public Tarif find(int id) {
		// TODO Auto-generated method stub
		return null;
	}

}
